home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Technotools
/
Technotools (Chestnut CD-ROM)(1993).ISO
/
lang_asm
/
seeports
/
seeports.asm
next >
Wrap
Assembly Source File
|
1990-03-31
|
6KB
|
492 lines
cseg segment
assume cs:cseg,ds:cseg
org 100h
start:
jmp initialize
old_keyboard_io dd 0,0
assume ds:nothing
new_keyboard_io proc far
sti
cmp ah,0
je ksread
jmp old_keyboard_io
ksread:
call keyread
iret
new_keyboard_io endp
keyread proc near
push si
readchar:
pushf
call old_keyboard_io
cmp al,0
je extended
jmp readdone
extended:
mov si,offset keytab
nextext:
cmp byte ptr cs:[si],0
je readdone
cmp ah,cs:[si]
je startexpand
add si,3
jmp nextext
startexpand:
add si,1
cmp word ptr cs:[si],0
je readdone
push ax
push bx
push cx
push dx
push si
push di
push bp
push ds
and ah,1
add ah,ah
mov bl,ah
mov bh,04
mov ax,0000
mov ds,ax
cmp word ptr [bx],0
je skip
mov bl,49h
mov ax,0b800h
cmp byte ptr [bx],7
jne other1
mov ax,0b000h
other1: mov cs:vaddr,ax
call word ptr cs:[si]
skip: pop ds
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
readdone:
pop si
ret
keyread endp
keytab db 120 ; alt-1
dw port1status
db 121 ; alt-2
dw port2status
db 0
dw 0
toggle db 0
assume cs:cseg,ds:cseg
port1status proc near
mov bx,cs
mov ds,bx
mov dh,3
call portstatus
ret
port1status endp
port2status proc near
mov bx,cs
mov ds,bx
mov dh,2
call portstatus
ret
port2status endp
portstatus proc near
push bx
call getpos
push bx
mov bx,0
call setpos
doshow: cmp toggle,dh ; same as last hot key?
jne newinfo ; no then skip
call restore98 ; else try to restore your data
jnz newinfo ; unless screen has scrolled.
mov toggle,0 ; if restored, just clear hot-key toggle
jmp bye
newinfo:
call save98 ; captures if its your data
mov toggle,dh
call showcom
call showbaud
call showlen
call showstop
call showparity
bye:
pop bx
call setpos
pop bx
ret
portstatus endp
pad db 98 dup(32)
signat db ' bits/char, '
save98 proc near
push ax
push bx
push es
push di
mov ax,vaddr
mov es,ax
mov di,36
mov bx,0
qchk: mov ah,es:[di]
cmp ah,signat[bx]
jne sok
inc di
inc di
inc bx
cmp bx,12
jne qchk
jmp sdone
sok: mov di,0
mov bx,0
sloop: mov ah,es:[di]
mov pad[bx],ah
inc bx
inc di
cmp bx,98 ; 98 bytes yet?
jne sloop
sdone: pop di
pop es
pop bx
pop ax
ret
save98 endp
restore98 proc near
push ax
push bx
push es
push di
mov ax,vaddr
mov es,ax
mov di,36
mov bx,0
sigchk: mov ah,es:[di]
cmp ah,signat[bx]
jne rdone
inc di
inc di
inc bx
cmp bx,12
jne sigchk
mov di,0
mov bx,0
rloop: mov ah,pad[bx]
mov es:[di],ah
inc bx
inc di
cmp bx,98 ; 98 bytes yet?
jne rloop
rdone: pop di
pop es
pop bx
pop ax
ret
restore98 endp
dec cx
com1 db 'COM1: ',0
com2 db 'COM2: ',0
comtab dw com1
dw com2
dw 0
showcom proc near
push bx
push dx
push si
mov bh,0
mov bl,3
sub bl,dh
shl bx,1
mov si,comtab[bx]
call dstring
pop si
pop dx
pop bx
ret
showcom endp
vaddr dw 0000h
b110 db ' 110 baud, ',0
b300 db ' 300 baud, ',0
b1200 db '1200 baud, ',0
b2400 db '2400 baud, ',0
b4800 db '4800 baud, ',0
b9600 db '9600 baud, ',0
divtab dw 1047
dw 384
dw 96
dw 48
dw 24
dw 12
dw 0
baudtab dw b110
dw b300
dw b1200
dw b2400
dw b4800
dw b9600
dw 0
showbaud proc near
push di
push si
push bx
call getbaud
mov di,0
baudloop:
cmp divtab[di],0
je bldone
cmp bx,divtab[di]
je dbaud
add di,2
jmp baudloop
dbaud:
mov si,baudtab[di]
call dstring
bldone:
pop bx
pop si
pop di
ret
showbaud endp
getbaud proc near
push ax
push dx
mov dl,0fbh
in al,dx
push ax
or al,80h
out dx,al
mov dl,0f8h
in al,dx
mov bl,al
mov dl,0f9h
in al,dx
mov bh,al
pop ax
mov dl,0fbh
out dx,al
pop dx
pop ax
ret
getbaud endp
char7 db '7 bits/char, ',0
char8 db '8 bits/char, ',0
chartab dw char7
dw char8
dw 0
showlen proc near
push ax
push bx
push si
call getlen
shl bx,1
mov si,chartab[bx]
call dstring
pop si
pop bx
pop ax
ret
showlen endp
getlen proc near
push ax
push dx
mov dl,0fbh
in al,dx
and al,03h
mov bh,0
mov bl,al
sub bx,2
pop dx
pop ax
ret
getlen endp
stop1 db '1 stop, ',0
stop2 db '2 stop, ',0
stoptab dw stop1
dw stop2
dw 0
showstop proc near
push bx
push si
call getstop
dec bx
shl bx,1
mov si,stoptab[bx]
call dstring
pop si
pop bx
ret
showstop endp
getstop proc near
push ax
push dx
mov bx,1
mov dl,0fbh
in al,dx
and al,04h
cmp al,0
je gsdone
inc bx
gsdone:
pop dx
pop ax
ret
getstop endp
pnone db 'no parity ',0
podd db 'odd parity ',0
peven db 'even parity',0
partab dw pnone
dw podd
dw peven
dw 0
showparity proc near
push bx
push si
call getparity
shl bx,1
mov si,partab[bx]
call dstring
pop si
pop bx
ret
showparity endp
getparity proc near
push ax
push cx
push dx
mov bx,0
mov dl,0fbh
in al,dx
and al,18h
cmp al,00h
je gpdone
cmp al,10h
je gpdone
inc bx
cmp al,18h
jne gpdone
inc bx
gpdone:
pop dx
pop cx
pop ax
ret
getparity endp
getpos proc near
push ax
push cx
push dx
mov ah,03h
mov bh,0
int 10h
mov bx,dx
pop dx
pop cx
pop ax
ret
getpos endp
setpos proc near
push ax
push bx
push dx
mov ah,02h
mov dx,bx
mov bh,0
int 10h
pop dx
pop bx
pop ax
ret
setpos endp
dstring proc near
push si
push ax
cmp si,0
je dsdone
dloop:
mov al,[si]
cmp al,0
je dsdone
call dchar
inc si
jmp dloop
dsdone:
pop ax
pop si
ret
dstring endp
dchar proc near
push ax
push bx
mov bh,1
mov ah,0eh
int 10h
pop bx
pop ax
ret
dchar endp
; CODE BEGINS
initialize:
assume cs:cseg,ds:cseg
mov bx,cs
mov ds,bx
mov al,16h
mov ah,35h
int 21h
mov word ptr cs:old_keyboard_io,bx
mov word ptr cs:old_keyboard_io[2],es
mov dx,offset cs:new_keyboard_io
mov al,16h
mov ah,25h
int 21h
mov dx,offset initialize
int 27h
cseg ends
end start